class StoreController < ApplicationController
  before_filter :find_cart, :except => :index
  def index
    #    product.rb文件内定义方法salabel_items()
    @products = Product.salable_items
  end

  #显示购物车
  def display_cart
    @items = @cart.items
    if @items.empty?
      redirect_to_index("您的购物车现在是空的。")
    end
    if params[:context] == :checkout
      render(:layout => false)
    end

  end

  #清空购物车
  def empty_cart
    @cart.empty!
    redirect_to_index('你的购物车被清空了。')
  end

  #  它需要为当前“会话”(如果没有则创建一个)找到购物车，
  #  并添加选择的产品到这个购物车中，然后显示此购物车中的内容。
  #  因为它被作为一个“动作”来调用，它必须是public的，
  #  所以必须被添加到private的find_cart()方法的上面。
  #  rescue子句可截获由Product.find()抛出的异常。
  def add_to_cart
    product = Product.find(params[:id])
    @cart.add_product(product)
    redirect_to(:action => 'display_cart')
  rescue
    logger.error("Attempt to access invalid product #{params[:id]}")
    redirect_to_index('你选择了无效的产品。')
  end

  #  首先检查以确保购物车中有东西。
  #  这阻止人们直接通过导航到达付款操作，并创建一个空的订单。
  #假设我们已经有了一个有效的cart，我们创建个新Order对象以用来填充view。
  #注意这个order还没有保存到数据库--它只是用view来组装checkout表单。
  def checkout
    @items = @cart.items
    if @items.empty?
      redirect_to_index("您的购物车是空的。")
    else
      @order = Order.new
    end
  end

  def save_order
    @order = Order.new(params[:order])
    @order.line_items << @cart.items
    if @order.save
      @cart.empty!
      redirect_to_index('感谢您的订单。')
    else
      render :action => :checkout
    end
  end


  #  它第一次需要时，指派个新的购物车对象给一个“会话”，
  #  并且在同样的“会话”内，在每次需要时都能找到这个购物车对象。
  private
  def find_cart
    @cart = (session[:cart] ||= Cart.new)
  end


  #转入了application中
  #
  #  #  定义公用的redirect_to_index方法
  #  def redirect_to_index(msg = nil)
  #    flash[:notice] = msg if msg
  #    redirect_to(:action => 'index')
  #  end

end
